module interrupts_registers(
    input epu_clk,
    input rst_n,

    input pdi_epu_we,
    input pdi_epu_re,
    input [15:0] pdi_epu_addr,
    input [7:0] pdi_epu_din,
    output reg [7:0] epu_pdi_dout,
    output reg epu_pdi_dout_valid,

    input ecat_epu_we,
    input ecat_epu_re,
    input [15:0] ecat_epu_addr,
    input [7:0] ecat_epu_din,
    output reg [7:0] epu_ecat_dout,
    output reg epu_ecat_dout_valid,

    output reg [15:0] ecat_event_mask_r,
    output reg [31:0] al_event_mask_r,
    output reg [15:0] ecat_event_request_r,
    output reg [31:0] al_event_request_r,

    input crc_check_success
);

    reg [15:0] ecat_event_mask_r_shadow;
    /* ecat event mask register 0x0200:0x0201 */
    always@(posedge epu_clk or negedge rst_n) begin
        if(!rst_n) begin
            ecat_event_mask_r <= 16'b0;
        end
        else if(crc_check_success) begin
            ecat_event_mask_r <= ecat_event_mask_r_shadow;
        end
    end
    /* ecat event mask shadow register  */
    always@(posedge epu_clk or negedge rst_n) begin
        if(!rst_n) begin
            ecat_event_mask_r_shadow <= 16'b0;
        end
        else if(pdi_epu_addr==16'h0200 && ecat_epu_we) begin
            ecat_event_mask_r_shadow[7:0] <= ecat_epu_din;
        end
        else if(pdi_epu_addr==16'h0201 && ecat_epu_we) begin
            ecat_event_mask_r_shadow[15:8] <= ecat_epu_din;
        end
    end
    /* al event mask register  */
    always@(posedge epu_clk or negedge rst_n) begin
        if(!rst_n) begin
            al_event_mask_r <= 32'b0;
        end
        else if(ecat_epu_we) begin
            case(pdi_epu_addr)
                16'h0204: al_event_mask_r[7:0] <= pdi_epu_din;
                16'h0205: al_event_mask_r[15:8] <= pdi_epu_din;
                16'h0206: al_event_mask_r[23:16] <= pdi_epu_din;
                16'h0207: al_event_mask_r[31:24] <= pdi_epu_din;
                default: al_event_mask_r <= al_event_mask_r;
            endcase
        end
    end
    
    /* ecat read */
    always@(posedge epu_clk or negedge rst_n) begin
        if(!rst_n) begin
            epu_ecat_dout <= 8'b0;
            epu_ecat_dout_valid <= 0;
        end
        else if(ecat_epu_re) begin
            case(ecat_epu_addr)
                16'h0200: begin
                    epu_ecat_dout <= ecat_event_mask_r[7:0];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0201: begin
                    epu_ecat_dout <= ecat_event_mask_r[15:8];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0204:  begin
                    epu_ecat_dout <= al_event_mask_r[7:0];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0205: begin
                    epu_ecat_dout <= al_event_mask_r[15:8];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0206: begin
                    epu_ecat_dout <= al_event_mask_r[23:16];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0207: begin
                    epu_ecat_dout <= al_event_mask_r[31:24];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0210: begin
                    epu_ecat_dout <= ecat_event_request_r[7:0];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0211: begin
                    epu_ecat_dout <= ecat_event_request_r[15:8];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0220: begin
                    epu_ecat_dout <= al_event_request_r[7:0];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0221: begin
                    epu_ecat_dout <= al_event_request_r[15:8];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0222: begin
                    epu_ecat_dout <= al_event_request_r[23:16];
                    epu_ecat_dout_valid <= 1;
                end
                16'h0223: begin
                    epu_ecat_dout <= al_event_request_r[31:24];
                    epu_ecat_dout_valid <= 1;
                end
                default: begin
                    epu_ecat_dout <= 8'b0;
                    epu_ecat_dout_valid <= 0;
                end
            endcase
        end
        else begin
            epu_ecat_dout <= 8'b0;
            epu_ecat_dout_valid <= 0;
        end
    end
    /* pdi read */
    always@(posedge epu_clk or negedge rst_n) begin
        if(!rst_n) begin
            epu_pdi_dout <= 8'b0;
            epu_pdi_dout_valid <= 0;
        end
        else if(pdi_epu_re) begin
            case(pdi_epu_addr)
                16'h0200: begin
                    epu_pdi_dout <= ecat_event_mask_r[7:0];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0201: begin
                    epu_pdi_dout <= ecat_event_mask_r[15:8];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0204:  begin
                    epu_pdi_dout <= al_event_mask_r[7:0];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0205: begin
                    epu_pdi_dout <= al_event_mask_r[15:8];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0206: begin
                    epu_pdi_dout <= al_event_mask_r[23:16];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0207: begin
                    epu_pdi_dout <= al_event_mask_r[31:24];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0210: begin
                    epu_pdi_dout <= ecat_event_request_r[7:0];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0211: begin
                    epu_pdi_dout <= ecat_event_request_r[15:8];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0220: begin
                    epu_pdi_dout <= al_event_request_r[7:0];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0221: begin
                    epu_pdi_dout <= al_event_request_r[15:8];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0222: begin
                    epu_pdi_dout <= al_event_request_r[23:16];
                    epu_pdi_dout_valid <= 1;
                end
                16'h0223: begin
                    epu_pdi_dout <= al_event_request_r[31:24];
                    epu_pdi_dout_valid <= 1;
                end
                default: begin
                    epu_pdi_dout <= 8'b0;
                    epu_pdi_dout_valid <= 0;
                end
            endcase
        end
        else begin
            epu_pdi_dout <= 8'b0;
            epu_pdi_dout_valid <= 0;
        end
    end


endmodule